package base.thread_JUC2.chapter03.demo06;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Phaser;

@Slf4j
public class MyPhaser extends Phaser {

//    public MyPhaser(int count){
//        super(count);
//    }

    /**
     * phaser每个阶段的变化都会自动执行onAdvance()方法(也就是每个阶段的最后一个线程执行完会调用)
     * @param phase
     * @param registeredParties
     * @return
     */
    @Override
    protected boolean onAdvance(int phase, int registeredParties) {
        switch (phase) {
            case 0:
                return studentsArrived();
            case 1:
                return finishFirstExercise();
            case 2:
                return finishSecondExercise();
            case 3:
                return finishExam();
            default:
                return true;
        }
    }

    private boolean finishExam() {
        log.info("所有学生结束了3轮测试");
        // 返回true就表示phaser要进入终止了(移除在phaser中的注册)
        return true;
    }

    private boolean finishSecondExercise() {
        log.info("所有学生结束第二测试，准备进入第三测试，{}", getRegisteredParties());
        return false;
    }

    private boolean finishFirstExercise() {
        log.info("所有学生结束第一测试，准备进入第二测试,{}", getRegisteredParties());
        return false;
    }

    private boolean studentsArrived() {
        log.info("所有的 {} 个学生已到齐", getRegisteredParties());
        // 返回false，表示Phaser继续执行，返回true表示Phaser已经完成并且进入了终止态.
        return false;
    }

}
